package com.tender.service;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 普通消息发送：
 * 1、单向发送：单向发送是指发送方只负责发送消息，不等待服务器回应，且没有回调函数触发。即只发送请求而不管响应。
 * 2、同步发送：同步发送是指消息发送方发出数据后，会在收到接收方发回响应之后才会发送下一个数据包的通讯方式。
 * 3、异步发送：异步发送是指发送方发出数据后，不等接收方发回响应，接着发送下一个数据包的通讯方式。发送方通过回调接口接收服务器响应，并对响应结果进行处理。
 */
@Slf4j
@Service
public class MqOrdinaryProducer {

    @Autowired
    private RocketMQTemplate rocketMqTemplate;

    /**
     * 单向消息
     */
    public void sendMq() {
        rocketMqTemplate.sendOneWay("topic-test", "测试发送单向消息》》》》》》》》》");
    }

    /**
     * 同步发送
     */
    public void sync() {
        SendResult sendResult = rocketMqTemplate.syncSend("topic-test", "sync发送消息。。。。。。。。。。");
        log.info("发送结果{}", sendResult);
    }

    /**
     * 异步发送
     */
    public void async() {
        String msg = "异步发送消息。。。。。。。。。。";
        log.info(">msg:<<" + msg);
        rocketMqTemplate.asyncSend("topic-test", msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult var1) {
                log.info("异步发送成功: {}", var1);
            }

            @Override
            public void onException(Throwable var1) {
                //发送失败可以执行重试
                log.info("异步发送失败: ", var1);
            }
        });
    }

}
